home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / APXMDIDV.PAK / APXMDDVA.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  12KB  |  460 lines

  1. //----------------------------------------------------------------------------
  2. //  Project ApxMdiDv
  3. //  Borland International
  4. //  Copyright ⌐ 1996. All Rights Reserved.
  5. //
  6. //  SUBSYSTEM:    ApxMdiDv Application
  7. //  FILE:         apxmddva.cpp
  8. //  AUTHOR:
  9. //
  10. //  OVERVIEW
  11. //  ~~~~~~~~
  12. //  Source file for implementation of TApxMdiDvApp (TApplication).
  13. //
  14. //----------------------------------------------------------------------------
  15.  
  16. #include <owl/pch.h>
  17.  
  18. #include <owl/buttonga.h>
  19. #include <owl/statusba.h>
  20. #include <owl/docmanag.h>
  21. #include <owl/filedoc.h>
  22.  
  23. #include <classlib/cmdline.h>
  24. #include <classlib/filename.h>
  25.  
  26. #include "apxmddva.h"
  27. #include "apmdmdic.h"
  28. #include "apmdmdi1.h"
  29. #include "apxmddev.h"
  30. #include "apxmddad.h"                        // Definition of about dialog.
  31.  
  32. //{{TApxMdiDvApp Implementation}}
  33.  
  34.  
  35.  
  36. //{{DOC_VIEW}}
  37. DEFINE_DOC_TEMPLATE_CLASS(TFileDocument, TApxMdiDvEditView, DocType1);
  38. //{{DOC_VIEW_END}}
  39.  
  40. //{{DOC_MANAGER}}
  41. DocType1 __dvt1("All Files", "*.*", 0, "txt", dtAutoDelete | dtUpdateDir | dtOverwritePrompt);
  42. //{{DOC_MANAGER_END}}
  43.  
  44.  
  45. //
  46. // Build a response table for all messages/commands handled by the application.
  47. //
  48. DEFINE_RESPONSE_TABLE2(TApxMdiDvApp, TRecentFiles, TApplication)
  49. //{{TApxMdiDvAppRSP_TBL_BEGIN}}
  50.   EV_OWLVIEW(dnCreate, EvNewView),
  51.   EV_OWLVIEW(dnClose,  EvCloseView),
  52.   EV_COMMAND(CM_FILESEND, CmFileSend),
  53.   EV_COMMAND_ENABLE(CM_FILESEND, CeFileSend),
  54.   EV_COMMAND(CM_HELPABOUT, CmHelpAbout),
  55.   EV_WM_DROPFILES,
  56.   EV_WM_WININICHANGE,
  57.   EV_OWLDOCUMENT(dnCreate, EvOwlDocument),
  58.   EV_OWLDOCUMENT(dnRename, EvOwlDocument),
  59.   EV_REGISTERED(MruFileMessage, CmFileSelected),
  60. //{{TApxMdiDvAppRSP_TBL_END}}
  61. END_RESPONSE_TABLE;
  62.  
  63.  
  64. //--------------------------------------------------------
  65. // TApxMdiDvApp
  66. // ~~~~~
  67. //
  68. TApxMdiDvApp::TApxMdiDvApp() : TApplication("AppExpert MDI DocView Example"), TRecentFiles(".\\ApxMdiDv.ini", 4)
  69. {
  70.   Printer = 0;
  71.   Printing = 0;
  72.  
  73.   SetDocManager(new TDocManager(dmMDI, this));
  74.  
  75.   ApxMail = new TMailer();
  76.  
  77.   // INSERT>> Your constructor code here.
  78. }
  79.  
  80.  
  81. TApxMdiDvApp::~TApxMdiDvApp()
  82. {
  83.   delete Printer;
  84.  
  85.   delete ApxMail;
  86.  
  87.   // INSERT>> Your destructor code here.
  88. }
  89.  
  90.  
  91. void TApxMdiDvApp::CreateGadgets(TDockableControlBar* cb, bool server)
  92. {
  93.   if (!server) {
  94.     cb->Insert(*new TButtonGadget(CM_MDIFILENEW, CM_MDIFILENEW));
  95.     cb->Insert(*new TButtonGadget(CM_MDIFILEOPEN, CM_MDIFILEOPEN));
  96.     cb->Insert(*new TButtonGadget(CM_FILESAVE, CM_FILESAVE));
  97.     cb->Insert(*new TSeparatorGadget(6));
  98.   }
  99.  
  100.   cb->Insert(*new TButtonGadget(CM_EDITCUT, CM_EDITCUT));
  101.   cb->Insert(*new TButtonGadget(CM_EDITCOPY, CM_EDITCOPY));
  102.   cb->Insert(*new TButtonGadget(CM_EDITPASTE, CM_EDITPASTE));
  103.   cb->Insert(*new TSeparatorGadget(6));
  104.   cb->Insert(*new TButtonGadget(CM_EDITUNDO, CM_EDITUNDO));
  105.   cb->Insert(*new TSeparatorGadget(6));
  106.   cb->Insert(*new TButtonGadget(CM_EDITFIND, CM_EDITFIND));
  107.   cb->Insert(*new TButtonGadget(CM_EDITFINDNEXT, CM_EDITFINDNEXT));
  108.  
  109.   if (!server) {
  110.     cb->Insert(*new TSeparatorGadget(6));
  111.     cb->Insert(*new TButtonGadget(CM_FILEPRINT, CM_FILEPRINT));
  112.     cb->Insert(*new TButtonGadget(CM_FILEPRINTPREVIEW, CM_FILEPRINTPREVIEW));
  113.   }
  114.  
  115.   // Add caption and fly-over help hints.
  116.   //
  117.   cb->SetCaption("Toolbar");
  118.   cb->SetHintMode(TGadgetWindow::EnterHints);
  119. }
  120.  
  121.  
  122. void TApxMdiDvApp::SetupSpeedBar(TDecoratedMDIFrame* frame)
  123. {
  124.   ApxHarbor = new THarbor(*frame);
  125.  
  126.   // Create default toolbar New and associate toolbar buttons with commands.
  127.   //
  128.   TDockableControlBar* cb = new TDockableControlBar(frame);
  129.   CreateGadgets(cb);
  130.  
  131.   // Setup the toolbar ID used by OLE 2 for toolbar negotiation.
  132.   //
  133.   cb->Attr.Id = IDW_TOOLBAR;
  134.  
  135.   ApxHarbor->Insert(*cb, alTop);
  136. }
  137.  
  138.  
  139. //--------------------------------------------------------
  140. // TApxMdiDvApp
  141. // ~~~~~
  142. // Application main window construction & intialization.
  143. //
  144. void TApxMdiDvApp::InitMainWindow()
  145. {
  146.   if (nCmdShow != SW_HIDE)
  147.     nCmdShow = (nCmdShow != SW_SHOWMINNOACTIVE) ? SW_SHOWNORMAL : nCmdShow;
  148.  
  149.   MdiClient = new TApxMdiDvMDIClient(this);
  150.   TDecoratedMDIFrame* frame = new TDecoratedMDIFrame(Name, IDM_MDI, *MdiClient, true, this);
  151.  
  152.   // Enable acceptance of dropped files
  153.   //
  154.   frame->Attr.ExStyle |= WS_EX_ACCEPTFILES;
  155.  
  156.   nCmdShow = (nCmdShow != SW_SHOWMINNOACTIVE) ? SW_SHOWNORMAL : nCmdShow;
  157.  
  158.   // Assign icons for this application.
  159.   //
  160.   frame->SetIcon(this, IDI_MDIAPPLICATION);
  161.   frame->SetIconSm(this, IDI_MDIAPPLICATION);
  162.  
  163.   // Associate with the accelerator table.
  164.   //
  165.   frame->Attr.AccelTable = IDM_MDI;
  166.  
  167.   TStatusBar* sb = new TStatusBar(frame, TGadget::Recessed,
  168.                                   TStatusBar::CapsLock        |
  169.                                   TStatusBar::NumLock         |
  170.                                   TStatusBar::ScrollLock);
  171.   frame->Insert(*sb, TDecoratedFrame::Bottom);
  172.  
  173.   SetupSpeedBar(frame);
  174.  
  175.   SetMainWindow(frame);
  176.  
  177.   frame->SetMenuDescr(TMenuDescr(IDM_MDI));
  178.  
  179. }
  180.  
  181.  
  182. //--------------------------------------------------------
  183. // TApxMdiDvApp
  184. // ~~~~~
  185. // Application instance initialization.
  186. //
  187. void TApxMdiDvApp::InitInstance()
  188. {
  189.   TApplication::InitInstance();
  190.  
  191.   ProcessCmdLine(lpCmdLine);
  192. }
  193.  
  194.  
  195. //--------------------------------------------------------
  196. // TApxMdiDvApp
  197. // ~~~~~
  198. // Process command line parameters.
  199. //
  200. void TApxMdiDvApp::ProcessCmdLine(char * CmdLine)
  201. {
  202.   TCmdLine cmd(CmdLine);
  203.  
  204.   while (cmd.Kind != TCmdLine::Done) {
  205.     if (cmd.Kind == TCmdLine::Option) {
  206.       if (strnicmp(cmd.Token, "unregister", cmd.TokenLen) == 0) {
  207.         UnRegisterInfo();
  208.         return;
  209.       }
  210.     }
  211.     cmd.NextToken();
  212.   }
  213.  
  214.   RegisterInfo();
  215. }
  216.  
  217.  
  218. //--------------------------------------------------------
  219. // TApxMdiDvApp
  220. // ~~~~~
  221. // Register application info.
  222. //
  223. void TApxMdiDvApp::RegisterInfo()
  224. {
  225.   TAPointer<char> buffer = new char[_MAX_PATH];
  226.  
  227.   GetModuleFileName(buffer, _MAX_PATH);
  228.  
  229.   TRegKey(TRegKey::ClassesRoot, "ApxMdiDv.Application\\DefaultIcon").SetDefValue(0, REG_SZ, buffer, strlen(buffer));
  230.   strcat(buffer, ",1");
  231.   TRegKey(TRegKey::ClassesRoot, "ApxMdiDv.Document.1\\DefaultIcon").SetDefValue(0, REG_SZ, buffer, strlen(buffer));
  232.   strcpy(buffer, "ApxMdiDv.Document.1");
  233.   TRegKey(TRegKey::ClassesRoot, ".txt").SetDefValue(0, REG_SZ, buffer, strlen(buffer));
  234. }
  235.  
  236.  
  237. //--------------------------------------------------------
  238. // TApxMdiDvApp
  239. // ~~~~~
  240. // Unregister application info.
  241. //
  242. void TApxMdiDvApp::UnRegisterInfo()
  243. {
  244.   TAPointer<char> buffer = new char[_MAX_PATH];
  245.  
  246.   GetModuleFileName(buffer, _MAX_PATH);
  247.  
  248.   TRegKey(TRegKey::ClassesRoot, "ApxMdiDv.Application").DeleteKey("DefaultIcon");
  249.   TRegKey(TRegKey::ClassesRoot, "ApxMdiDv.Document.1").DeleteKey("DefaultIcon");
  250.  
  251.   TRegKey::ClassesRoot.DeleteKey("ApxMdiDv.Application");
  252.   TRegKey::ClassesRoot.DeleteKey("ApxMdiDv.Document.1");
  253.   TRegKey::ClassesRoot.DeleteKey(".txt");
  254. }
  255.  
  256.  
  257.  
  258. //--------------------------------------------------------
  259. // TApxMdiDvApp
  260. // ~~~~~
  261. // Response Table handlers:
  262. //
  263. void TApxMdiDvApp::EvNewView(TView& view)
  264. {
  265.   TMDIClient* mdiClient = TYPESAFE_DOWNCAST(GetMainWindow()->GetClientWindow(), TMDIClient);
  266.   if (mdiClient) {
  267.     TApxMdiDvMDIChild* child = new TApxMdiDvMDIChild(*mdiClient, 0, view.GetWindow());
  268.  
  269.     // Set the menu descriptor for this view.
  270.     //
  271.     if (view.GetViewMenu())
  272.       child->SetMenuDescr(*view.GetViewMenu());
  273.  
  274.     // Assign icons with this child window.
  275.     //
  276.     child->SetIcon(this, IDI_DOC);
  277.     child->SetIconSm(this, IDI_DOC);
  278.  
  279.     child->Create();
  280.   }
  281. }
  282.  
  283.  
  284. void TApxMdiDvApp::EvCloseView(TView&)
  285. {
  286. }
  287.  
  288.  
  289. void TApxMdiDvApp::CeFileSend(TCommandEnabler& ce)
  290. {
  291.   ce.Enable((GetDocManager()->GetCurrentDoc() != 0)
  292.             && ApxMail->IsMAPIAvailable());
  293. }
  294.  
  295.  
  296. void TApxMdiDvApp::CmFileSend ()
  297. {
  298.   // Check to see if a document exists
  299.   //
  300.   TDocument* currentDoc = GetDocManager()->GetCurrentDoc();
  301.  
  302.   if (currentDoc) {
  303.     TAPointer<char> savedPath = new char[_MAX_PATH];
  304.     TAPointer<char> docName = new char[_MAX_PATH];
  305.  
  306.     bool dirtyState = currentDoc->IsDirty();
  307.  
  308.     if (currentDoc->GetDocPath())
  309.       strcpy(savedPath, currentDoc->GetDocPath());
  310.     else
  311.       strcpy(savedPath, "");
  312.  
  313.     if (currentDoc->GetTitle())
  314.       strcpy(docName, currentDoc->GetTitle());
  315.     else
  316.       strcpy(docName, "Document");
  317.  
  318.     TFileName tempFile(TFileName::TempFile);
  319.  
  320.     currentDoc->SetDocPath(tempFile.Canonical().c_str());
  321.     currentDoc->Commit(true);
  322.  
  323.     currentDoc->SetDocPath(savedPath);
  324.     currentDoc->SetDirty(dirtyState);
  325.  
  326.     ApxMail->SendDocuments(GetMainWindow(), tempFile.Canonical().c_str(), docName, false);
  327.  
  328.     tempFile.Remove();
  329.   }
  330. }
  331.  
  332.  
  333. //--------------------------------------------------------
  334. // TApxMdiDvApp
  335. // ~~~~~~~~~~~
  336. // Menu Help About ApxMdiDv command
  337. void TApxMdiDvApp::CmHelpAbout()
  338. {
  339.   // Show the modal dialog.
  340.   //
  341.   TApxMdiDvAboutDlg(GetMainWindow()).Execute();
  342. }
  343.  
  344.  
  345. void TApxMdiDvApp::EvDropFiles(TDropInfo drop)
  346. {
  347.   TFileDropletList files;
  348.  
  349.   // Iterate thru the entries in drop and create FileDrops objects for each
  350.   // one.
  351.   //
  352.   int fileCount = drop.DragQueryFileCount();  // Number of files dropped.
  353.   for (int i = 0; i < fileCount; i++)
  354.     files.Add(new TFileDroplet(drop, i));
  355.  
  356.   // Open the files that were dropped.
  357.   //
  358.   AddFiles(files);
  359.  
  360.   // Release the memory allocated for this handle with DragFinish.
  361.   //
  362.   drop.DragFinish();
  363. }
  364.  
  365.  
  366. void TApxMdiDvApp::AddFiles(TFileDropletList& files)
  367. {
  368.   // Open all files dragged in.
  369.   //
  370.   for (TFileDropletListIter fileIter(files); fileIter; fileIter++) {
  371.     TDocTemplate* tpl = GetDocManager()->MatchTemplate(fileIter.Current()->GetName());
  372.     if (tpl)
  373.       GetDocManager()->CreateDoc(tpl, fileIter.Current()->GetName());
  374.   }
  375. }
  376.  
  377.  
  378. void TApxMdiDvApp::EvOwlDocument(TDocument& doc)
  379. {
  380.   if (doc.GetDocPath())
  381.     SaveMenuChoice(doc.GetDocPath());
  382. }
  383.  
  384.  
  385. int32 TApxMdiDvApp::CmFileSelected(uint wp, int32)
  386. {
  387.   TAPointer<char> text = new char[_MAX_PATH];
  388.  
  389.   GetMenuText(wp, text, _MAX_PATH);
  390.   TDocTemplate* tpl = GetDocManager()->MatchTemplate(text);
  391.   if (tpl)
  392.     GetDocManager()->CreateDoc(tpl, text);
  393.   return 0;
  394. }
  395.  
  396.  
  397. void TApxMdiDvApp::EvWinIniChange(char far* section)
  398. {
  399.   if (strcmp(section, "windows") == 0) {
  400.     // If the device changed in the WIN.INI file then the printer
  401.     // might have changed.  If we have a TPrinter(Printer) then
  402.     // check and make sure it's identical to the current device
  403.     // entry in WIN.INI.
  404.     //
  405.     if (Printer) {
  406.       const int bufferSize = 255;
  407.       char printDBuffer[bufferSize];
  408.       LPSTR printDevice = printDBuffer;
  409.       LPSTR devName;
  410.       LPSTR driverName = 0;
  411.       LPSTR outputName = 0;
  412.       if (::GetProfileString("windows", "device", "", printDevice, bufferSize)) {
  413.         // The string which should come back is something like:
  414.         //
  415.         //      HP LaserJet III,hppcl5a,LPT1:
  416.         //
  417.         // Where the format is:
  418.         //
  419.         //      devName,driverName,outputName
  420.         //
  421.         devName = printDevice;
  422.         while (*printDevice) {
  423.           if (*printDevice == ',') {
  424.             *printDevice++ = 0;
  425.             if (!driverName)
  426.               driverName = printDevice;
  427.             else
  428.               outputName = printDevice;
  429.           }
  430.           else
  431.             printDevice = ::AnsiNext(printDevice);
  432.         }
  433.  
  434.         if (Printer->GetSetup().Error != 0                ||
  435.             strcmp(devName, Printer->GetSetup().GetDeviceName()) != 0  ||
  436.             strcmp(driverName, Printer->GetSetup().GetDriverName()) != 0 ||
  437.             strcmp(outputName, Printer->GetSetup().GetOutputName()) != 0 ) {
  438.           // New printer installed so get the new printer device now.
  439.           //
  440.           delete Printer;
  441.           Printer = new TPrinter(this);
  442.         }
  443.       }
  444.       else {
  445.         // No printer installed(GetProfileString failed).
  446.         //
  447.         delete Printer;
  448.         Printer = new TPrinter(this);
  449.       }
  450.     }
  451.   }
  452. }
  453.  
  454.  
  455. int OwlMain(int , char* [])
  456. {
  457.   TApxMdiDvApp   app;
  458.   return app.Run();
  459. }
  460.